#include"lianbiao.h"
void SLTPrint(SLTNode* phead)
{
    SLTNode*cur=phead;
    while(cur)
    {
        printf("%d->",cur->a);
          cur=cur->next;
    }
    printf("NULL\n");
}
SLTNode* SLTBuyNode(SLTDataType x)
{
    SLTNode* newnode;
    newnode=(SLTNode*)malloc(sizeof(SLTNode));
    if(newnode==NULL)
    {
        perror("malloc");
        exit(1);
    }
    else
    {
newnode->a=x;
    newnode->next=NULL;
    }
    return newnode;
    
}
void SLTPushBack(SLTNode** pphead, SLTDataType x)
{
    SLTNode*new=SLTBuyNode(x);
    if(*pphead==NULL)
    {
        *pphead=new;
    }else
    {
        SLTNode* cur=*pphead;
        while(cur->next!=NULL)//(*pphead->next!=NULL);
        {
         cur=cur->next;
        }
        cur->next=new;
    }
}

void SLTPushFront(SLTNode** pphead, SLTDataType x)
{
    assert(pphead);
    SLTNode*cur=*pphead;
    SLTNode*new=SLTBuyNode(x);
  new->next=cur;
  *pphead=new;
}
void SLTPopBack(SLTNode** pphead)
{
    assert(pphead&&*pphead);
    SLTNode* cur=*pphead;
    SLTNode*pre=*pphead;
     if(cur->next==NULL)
     {
        free(*pphead);
        *pphead=NULL;
     }else
     {
        while(cur->next!=NULL)
        {
            pre=cur;
            cur=cur->next;
        }
       pre->next=NULL;
       free(cur);
     }
}
void SLTPopFront(SLTNode** pphead)
{
    assert(*pphead&&pphead);
    SLTNode* cur=(*pphead)->next;
    free(*pphead);
    *pphead=cur;
}
SLTNode* SLTFind(SLTNode* phead, SLTDataType x)
{
    while(phead!=NULL)
    {
        if(phead->a==x)
        {
           // printf("找到了\n");
            return phead;
        }
        phead=phead->next;
    }
    printf("没找到\n");
    return NULL;
    
}
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{
    assert(*pphead&&pphead&&pos);
    SLTNode*new= SLTBuyNode( x);
    if(pos==*pphead)
    {
        SLTPushBack(pphead,  x);
    }
    assert(pphead&&pos);
    SLTNode* pre=*pphead;
    while(pre->next!=pos)
    {
        pre=pre->next;
    }
     new->next=pos;
     pre->next=new;
}
void SLTInsertAfter(SLTNode* pos, SLTDataType x)
{
    assert(pos);
 SLTNode*new= SLTBuyNode(x);
 new->next=pos->next;
 pos->next=new;
}
void SLTErase(SLTNode** pphead, SLTNode* pos)
{
    assert(*pphead&&pphead&&pos);
    SLTNode* pre=*pphead;
    if(pos=*pphead)
    {
    SLTPopFront(pphead);
    }
    while(pre->next!=pos)
    {
        pre=pre->next;
    }
    pre->next=pos->next;
    free(pos);
    pos=NULL;
}
void SLTEraseAfter(SLTNode* pos)
{
    assert(pos&&pos->next);
    SLTNode*new=pos;
    pos=pos->next;
    new->next=pos->next;
    free(pos);
    pos=NULL;
}
void SListDesTroy(SLTNode** pphead)
{
    assert(*pphead&&pphead);
    SLTNode*cur=*pphead;
    while((*pphead)!=NULL)
    {
        cur=cur->next;
        free(*pphead);
        *pphead=cur;
    }
}
int main()
{ 
    SLTNode*plist=NULL;
    SLTPushBack(&plist, 1);
    SLTPrint(plist);
    SLTPushBack(&plist, 2);
    SLTPrint(plist);
    SLTPushBack(&plist, 3);
    SLTPrint(plist);
    SLTPushBack(&plist, 4);
    SLTPrint(plist);
    SLTNode*find= SLTFind(plist, 3);
    SLTEraseAfter(find);
    SLTPrint(plist);
    SLTPopBack(&plist);
    SLTPrint(plist);
    SLTPopFront(&plist);
     SLTPrint(plist);
    return 0;
}